package com.wholesale.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
*
* @author davelin
*/
public class Maths {

   public static final double E = 1.0E-8;
   private static DecimalFormat nf = new DecimalFormat(",##0.00");

   public Maths() {
   }

   public static double getBiggerInt(double value) {
       if (Math.floor(value) == value) {
           return Math.floor(value);
       } else {
           return Math.floor(value) + 1;
       }
   }

   /**
    * 取精度
    * 
    * @param value
    *            double
    * @param prec
    *            int
    * @return double
    */
   public static double round(double value, int prec) {
       return new BigDecimal(new Double(value).toString()).setScale(prec,
               BigDecimal.ROUND_HALF_UP).doubleValue();
   }

   /**
    * 等于
    * 
    * @param d1
    * @param d2
    * @return
    */
   public static boolean isEqual(double d1, double d2) {
       return Math.abs(d1 - d2) < E;
   }

   /**
    * 
    * @param d1
    * @return
    */
   public static boolean greatZero(double d1) {
       return Math.abs(d1) > E;
   }

   public static DecimalFormat getFormator(String pattern, int fraction) {
       if (nf == null) {
           nf = new DecimalFormat();
       }
       nf.applyPattern(pattern);
       nf.setMaximumFractionDigits(fraction);
       nf.setMinimumFractionDigits(fraction);
       return nf;
   }

   /**
    * 格式化金额
    * 
    * @param amt
    * @param fraction
    * @return
    */
   public static String formatAmt(double amt, int fraction) {
       getFormator(",#00.00", fraction);
       return nf.format(amt);
   }

   /**
    * 提供精确的乘法运算。
    * 
    * @param v1
    *            被乘数
    * @param v2
    *            乘数
    * @return 两个参数的积
    */
   public static double mul(double v1, double v2) {
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));

       return b1.multiply(b2).doubleValue();
   }

   /**
    * 提供精确的加运算
    */
   public static double add(double v1, double v2) {
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));

       return b1.add(b2).doubleValue();
   }

   /**
    * 提供精确的除运算
    */
   public static double div(double v1, double v2, int prec) {
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.divide(b2, prec, BigDecimal.ROUND_HALF_UP).doubleValue();
   }

   /**
    * 提供精确的除运算
    * 
    * @param v1
    * @param v2
    * @return
    */
   public static double div(double v1, double v2) {
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.divide(b2).doubleValue();
   }

   /**
    * 提供精确的减运算
    */
   public static double sub(double v1, double v2) {
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));

       return b1.subtract(b2).doubleValue();
   }
}